#!/usr/bin/python
# -*- coding: utf8 -*-
import sys
import string
import pickle
import os
from qt import *
from main import *

class client:
    def __init__(self,nom,prenom,rue,npa,email):
        self.nom=nom
        self.prenom=prenom
        self.rue=rue
        self.npa=npa
        self.email=email
        
    def __repr__(self):
        return string.upper(self.nom)+" "+string.upper(self.prenom[0:1])+self.prenom[1:]+" ("+self.rue+", "+self.npa+", "+self.email+")"
        
class carnet:
    def __init__(self,filename):
        self.clients = []
        # restauration du carnet de client depuis le fichier "filename"
        self.filename=filename
        if(os.path.exists(filename)):
            f = file(filename,'r')
            self.clients = pickle.load(f)
            f.close()
    
    # sauver la liste de clients dans le fichier
    def sauver(self):
        f = file(self.filename,'w')
        pickle.dump(self.clients,f) 
        f.close()
        
    def ajouterClient(self, c):
        self.clients.append(c)
        
    def remplacerClient(self,index,c):
        self.clients[index]=c
        
    def client(self,indice):
        return self.clients[indice]
        
    def supprimer(self,indice):
        del self.clients[indice]
    
    # trie les clients selon la fonction de comparaison "sortFunc"    
    def trier(self):
        self.clients.sort(self.sortFunc)
    
    # fonction de tri sur les noms des clients
    def sortFunc(self,x,y):
        return cmp(string.lower(x.nom),string.lower(y.nom))

    # représentation des clients sous forme de liste pour l'affichage
    def listerClients(self):
        return [repr(client) for client in self.clients]    

    def __repr__(self):
        return "\n".join(self.listerClients())

class app:
    index=-1
    def __init__(self,args):
        # l'application Qt
        self.qtapp=QApplication(args)
        # création du carnet
        self.c = carnet('carnet.obj')
        # création de la fenêtre principale
        self.win=Main()
        # affichage de la liste des clients dans la fenêtre
        self.updateList()
        # affichage de la fenêtre
        self.win.show()

        # connection SLOT/SIGNAL de Qt
        self.qtapp.connect(self.win.fileSaveAction,SIGNAL("activated()"),self.c.sauver)
        self.qtapp.connect(self.win.fileExitAction,SIGNAL("activated()"),self.qtapp,SLOT("quit()"))
        self.qtapp.connect(self.win.ajouter,SIGNAL("clicked()"),self.ajouter)
        self.qtapp.connect(self.win.modifier,SIGNAL("clicked()"),self.modifier)
        self.qtapp.connect(self.win.supprimer,SIGNAL("clicked()"),self.supprimer)
        self.qtapp.connect(self.win.trier,SIGNAL("clicked()"),self.trier)
        self.qtapp.connect(self.win.liste,SIGNAL("highlighted(int)"),self.selectionListe)
        self.qtapp.connect(self.qtapp, SIGNAL("lastWindowClosed()"),self.qtapp,SLOT("quit()"))
        self.qtapp.exec_loop()

    # création d'un nouveau client en utilisant les champs courants de la fenêtre
    def newClient(self):
        c = client(
            self.win.nom.text().ascii(),
            self.win.prenom.text().ascii(),
            self.win.rue.text().ascii(),
            self.win.npa.text().ascii(),
            self.win.email.text().ascii()
        )
        return c

    # bouton ajouter
    def ajouter(self):
        self.c.ajouterClient(self.newClient())
        i=self.index
        self.updateList()
        self.win.liste.setSelected(i,True)
        
    # mettre la liste à jour
    def updateList(self):
        self.win.liste.clear()
        self.win.liste.insertStrList(self.c.listerClients())

    # quand un client est selectionné dans la liste
    def selectionListe(self,index):
        self.index = index
        self.win.nom.setText(self.c.client(index).nom)
        self.win.prenom.setText(self.c.client(index).prenom)
        self.win.rue.setText(self.c.client(index).rue)
        self.win.npa.setText(self.c.client(index).npa)
        self.win.email.setText(self.c.client(index).email)
        self.win.modifier.setEnabled(True)

    # bouton supprimer
    def supprimer(self):
        if( self.index>=0 ):
            i=self.index
            self.c.supprimer(self.index)
            self.updateList()
            self.win.liste.setSelected(i,True)

    # bouton modifier
    def modifier(self):
        if( self.index>=0 ):
            self.c.remplacerClient(self.index,self.newClient())
            i=self.index
            self.updateList()
            self.win.liste.setSelected(i,True)

    # bouton trier
    def trier(self):
        self.c.trier()
        self.updateList()
        self.index=-1
        self.win.modifier.setEnabled(False)

def main(args):
    mapp = app(args)

if __name__=="__main__":
        main(sys.argv)
